package com.hm.common.common;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

/**
 * @author shishun.wang
 * @date 2016年5月12日 下午11:33:04
 * @version 1.0
 * @describe
 */
public class EncryptUtil {

	/**
	 * @author
	 * @version 1.0
	 * @date 12:59:51 PM May 31, 2014
	 * @statement Without my written permission, any unit and individual shall
	 *            not in any way or reason of the above products, services,
	 *            information, and any part of the material to use, copy,
	 *            modify, transcribing, spread or with other products bound use
	 *            and marketing. Hereby solemnly statement!
	 * @team chasing (personal<author></author>)
	 * @email
	 * @describe md5加密
	 */
	public static class Md5 {
		private final static String[] strDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c",
				"d", "e", "f" };

		// 返回形式为数字跟字符串
		private static String byteToArrayString(byte bByte) {
			int iRet = bByte;
			if (iRet < 0) {
				iRet += 256;
			}
			int iD1 = iRet / 16;
			int iD2 = iRet % 16;
			return strDigits[iD1] + strDigits[iD2];
		}

		// 转换字节数组为16进制字串
		private static String byteToString(byte[] bByte) {
			StringBuffer sBuffer = new StringBuffer();
			for (int i = 0; i < bByte.length; i++) {
				sBuffer.append(byteToArrayString(bByte[i]));
			}
			return sBuffer.toString();
		}

		public static String getMD5Code(String strObj) {
			String resultString = null;
			if (null != strObj) {
				try {
					resultString = new String(strObj);
					MessageDigest md = MessageDigest.getInstance("MD5");
					// md.digest() 该函数返回值为存放哈希值结果的byte数组
					resultString = byteToString(md.digest(strObj.getBytes()));
				} catch (NoSuchAlgorithmException ex) {
					ex.printStackTrace();
				}
			}
			return resultString;
		}
	}

	/**
	 * @author shishun.wang
	 * @date 上午10:01:03 2016年5月19日
	 * @version 1.0
	 * @describe Base64
	 */
	public static class Base64 {

		public static char[] encode(byte[] data) {
			char[] out = new char[((data.length + 2) / 3) * 4];

			for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {
				boolean quad = false;
				boolean trip = false;
				int val = (0xFF & (int) data[i]);
				val <<= 8;
				if ((i + 1) < data.length) {
					val |= (0xFF & (int) data[i + 1]);
					trip = true;
				}
				val <<= 8;
				if ((i + 2) < data.length) {
					val |= (0xFF & (int) data[i + 2]);
					quad = true;
				}
				out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];
				val >>= 6;
				out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];
				val >>= 6;
				out[index + 1] = alphabet[val & 0x3F];
				val >>= 6;
				out[index + 0] = alphabet[val & 0x3F];
			}
			return out;
		}

		public static byte[] decode(char[] data) {
			int len = ((data.length + 3) / 4) * 3;
			if (data.length > 0 && data[data.length - 1] == '=')
				--len;
			if (data.length > 1 && data[data.length - 2] == '=')
				--len;
			byte[] out = new byte[len];
			int shift = 0;
			int accum = 0;
			int index = 0;
			for (int ix = 0; ix < data.length; ix++) {
				int value = codes[data[ix] & 0xFF];
				if (value >= 0) {
					accum <<= 6;
					shift += 6;
					accum |= value;
					if (shift >= 8) {
						shift -= 8;
						out[index++] = (byte) ((accum >> shift) & 0xff);
					}
				}
			}
			if (index != out.length)
				throw new Error("miscalculated data length!");
			return out;
		}

		private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
				.toCharArray();

		private static byte[] codes = new byte[256];

		static {
			for (int i = 0; i < 256; i++)
				codes[i] = -1;
			for (int i = 'A'; i <= 'Z'; i++)
				codes[i] = (byte) (i - 'A');
			for (int i = 'a'; i <= 'z'; i++)
				codes[i] = (byte) (26 + i - 'a');
			for (int i = '0'; i <= '9'; i++)
				codes[i] = (byte) (52 + i - '0');
			codes['+'] = 62;
			codes['/'] = 63;
		}
	}

	/**
	 * 获取随机密码
	 * @return
	 */
	public static String getRandomPwd(){
		char[] chars = Base64.encode(UUID.randomUUID().toString().getBytes());
		String random = new String(chars);
		return random.substring(5, 14);
	}
}
